#include<iostream>
#include<unistd.h>
#include<cstdlib>
#include<string>
#include<sys/types.h>
#include<sys/wait.h>



using namespace std;

// int main()
// {
//     int fds[2]={0};
//     int n = pipe(fds);

//     if(n!=0)
//     {
//         cout<<cerr<<"pipe error"<<endl;
//     }

//     if(n==0)
//     {
//         cout<<"fds[0]:"<<fds[0]<<endl;
//         cout<<"fds[1]:"<<fds[1]<<endl;
//     }

//     return 0;
// }


// int main()
// {
//     int fds[2]={0};
//     int n = pipe(fds);

//     if(n!=0)
//     {
//         cout<<cerr<<"pipe error"<<endl;
//     }


//     return 0;
// }



int main()
{
    int fds[2]={0};
    int n = pipe(fds);

    if(n!=0)
    {
        cerr<<"pipe error"<<endl;
    }

    pid_t id = fork();

    if(id<0)
    {
        cerr<<"fork error"<<endl;
        return 2;
    }
    else if(id == 0)
    {
        // 子
        close(fds[0]);

        int cnt = 0;
        while(true)
        {
            string message = "hello pipe, hello";
            message += to_string(getpid());
            message += ", ";
            message += to_string(cnt);

            ::write(fds[1],message.c_str(),message.size());
            cnt++;
            sleep(1);
        }

        exit(0);
    }
    else
    {
        // 父
        close(fds[1]);

        char buffer[1024];
        while(true)
        {
            ssize_t n = ::read(fds[0],buffer,1024);
            if(n>0)
            {
                buffer[n] = 0;
                cout<<"child->father, message:"<<buffer<<endl;
            }
        }

        pid_t rid = waitpid(id,nullptr,0);
        cout<<"father wait son sucess:"<<rid<<endl;
    }

    return 0;
}